# ====================================================================================
# === CSV to Shapefile Converter =====================================================
# ====================================================================================
# 描述:
#   本脚本用于将包含经纬度坐标的CSV文件转换为标准的ESRI Shapefile (.shp) 文件。
#   转换后的Shapefile将包含所有原始数据列，并被正确设置为 WGS-84 (EPSG:4326) 坐标系。
#
# 作者: Gemini
# 日期: 2025-10-13
# ====================================================================================

import pandas as pd
import geopandas as gpd

# --- 1. 参数配置 (请根据您的CSV文件进行修改) ---

# 输入的CSV文件名
INPUT_CSV = "poi仓山区.csv"

# 输出的Shapefile文件名 (程序会自动添加.shp后缀)
OUTPUT_SHP = "poi仓山区.shp"

# CSV文件中代表经度和纬度的列名 (非常重要！)
LONGITUDE_COLUMN = "geolocation_lng"
LATITUDE_COLUMN = "geolocation_lat"

# --- 2. 主转换逻辑 ---

def convert_csv_to_shp(csv_path, shp_path, lon_col, lat_col):
    """
    执行从CSV到Shapefile的转换。
    """
    print(f"--- 🚀 开始将 '{csv_path}' 转换为Shapefile ---")
    
    try:
        # a. 使用Pandas读取CSV文件
        print(f"[1/3] 正在读取CSV文件: '{csv_path}'...")
        try:
            df = pd.read_csv(csv_path, encoding='utf-8')
        except UnicodeDecodeError:
            print("   - 使用utf-8编码失败，尝试使用gbk编码...")
            df = pd.read_csv(csv_path, encoding='gbk')
            
        print(f"✅ CSV文件读取成功，共 {len(df)} 行数据。")

        # b. 检查经纬度列是否存在
        if not all(col in df.columns for col in [lon_col, lat_col]):
            raise ValueError(f"错误: CSV文件中未找到指定的经度列 '{lon_col}' 或纬度列 '{lat_col}'！")
        
        # c. 使用Geopandas创建GeoDataFrame
        #    gpd.points_from_xy() 函数会根据经纬度列创建Point几何对象
        print("[2/3] 正在从经纬度坐标创建地理信息...")
        gdf = gpd.GeoDataFrame(
            df, 
            geometry=gpd.points_from_xy(df[lon_col], df[lat_col]),
            crs="EPSG:4326"  # <-- 关键步骤：明确声明这些坐标是WGS-84标准
        )
        print("✅ 地理信息创建成功，坐标系已设置为 WGS-84 (EPSG:4326)。")

        # d. 将GeoDataFrame保存为Shapefile
        print(f"[3/3] 正在将数据写入Shapefile: '{shp_path}'...")
        # encoding='utf-8' 确保中文字段在GIS软件中能正确显示
        gdf.to_file(shp_path, driver='ESRI Shapefile', encoding='utf-8')
        
        print(f"\n--- 🎉 转换成功！ ---")
        print(f"   Shapefile已保存至: {shp_path}")

    except FileNotFoundError:
        print(f"❌ 错误: 找不到输入的CSV文件 '{csv_path}'。请检查文件名和路径。")
    except Exception as e:
        print(f"❌ 转换过程中发生未知错误: {e}")

# --- 3. 执行转换 ---

if __name__ == "__main__":
    convert_csv_to_shp(INPUT_CSV, OUTPUT_SHP, LONGITUDE_COLUMN, LATITUDE_COLUMN)